# -*-coding:utf-8-*-
import numpy as np

a = np.arange(1, 9)

# ndarray.reshape。order:'C'为按行顺序重排，'F'为按列顺序重排
b: np.ndarray = a.reshape((2, 4), order='C')  # [[1 2 3 4] [5 6 7 8]]

# ndarray.ravel(order='C')，返回折叠为一维的数组副本
a.ravel()  # [1 2 3 4 5 6 7 8]

# 翻转数组的维度
b.transpose()  # [[1 5] [2 6] [3 7] [4 8]], 等同b.transpose((1,0))

"""
数组分割
1.numpy.split(ary, i_or_s, axis=0)，沿特定的轴将数组分割为子数组,返回数组列表
2.numpy.vsplite。按行分割，参数和numpy.split相同
3.numpy.hsplite。按列分割，参数和numpy.split相同
i_or_s可以是整数，表明要从输入数组创建的等大小的子数组的数量。如果此参数是列表，则列表元素表明要分割的位置下标
"""
a1 = np.split(a, 2)  # [array([1, 2, 3, 4]), array([5, 6, 7, 8])]
a2 = np.split(a, [1, 4])  # [array([1]), array([2, 3, 4]), array([5, 6, 7, 8])]
a3 = np.vsplit(b, 2)  # [array([[1, 2, 3, 4]]), array([[5, 6, 7, 8]])]
a4 = np.hsplit(b, 2)  # [array([[1, 2], [5, 6]]), array([[3, 4], [7, 8]])]

# 修改数组形状。与ndarray.reshape的区别是resize是修改数组本身
b.resize((4, 2))  # [[1 2] [3 4] [5 6] [7 8]]

# 指定位置插入。numpy.insert(ary, obj, values, axis)，values为插入值,obj为插入位置下标
a5 = np.insert(b, 1, [9, 10])  # [ 1 9 10 2 3 4 5 6 7 8]，在下标1处插入,axis为None时插入后的数组会变成一维的
a6 = np.insert(b, 1, [[9, 10], [11, 12]], axis=0)  # [[1 2] [9 10] [11 12] [3 4] [5 6] [7 8]]，按行插入
a7 = np.insert(b, 1, [[9], [10]], axis=1)  # [[1 9 10 2] [3 9 10 4] [5 9 10 6] [7 9 10 8]]，按列插入

"""
指定位置删除
numpy.delete(ary, obj, axis)，obj可以是Int/Iterable/Slice(通过numpy.s_[start:stop:step])
"""
a8 = np.delete(b, 0)  # [2 3 4 5 6 7 8],删除下标0处的元素，axis为None时删除元素后的数组会变成一维的
a9 = np.delete(b, [1, 2], axis=0)  # [[1 2] [7 8]]，删除第2和3行
a10 = np.delete(b, np.s_[::2], axis=0)  # [[3 4] [7 8]]，使用np.s_切片删除偶数行

"""
数组去重
numpy.unique(arr, return_index, return_inverse, return_counts)，返回去重后的一维数组(若后面参数有的为True，返回数组组成的元组)
return_index为true则会返回去重数组中元素在原数组中(第一次出现的位置)的下标
return_inverse为true则会返回原数组中元素去重数组中的下标
return_counts为true则会返回去重数组中元素在原数组中的重复次数
"""
c = np.array([[1, 2, 2, 3], [np.NAN, np.NAN, 7, 7]])
a11 = np.unique(c)  # [ 1.  2.  3.  7. nan]
a12 = np.unique(c, return_index=True)    # tuple(array([ 1.,  2.,  3.,  7., nan]), array([0, 1, 3, 6, 4]))
a13 = np.unique(c, return_inverse=True)  # tuple(array([ 1.,  2.,  3.,  7., nan]), array([0, 1, 1, 2, 4, 4, 3, 3]))
a14 = np.unique(c, return_counts=True)   # tuple(array([ 1.,  2.,  3.,  7., nan]), array([1, 2, 1, 2, 2]))
